#include "Calculator.hpp"
#include "Protocol.hpp"
#include <functional>
#include "Log.hpp"
using namespace LogMudule;
using Cal_t = std::function<response(const request &)>;
class Parse
{
public:
    Parse()
    {
    }

    void RegisterCal(Cal_t cal)
    {
        _cal = cal;
    }

    std::string HandlerBuffer(std::string &packge)
    {
        std::string result_str;
        std::string part_packge;
        while (Decode(packge, &part_packge)) // 判断是否是完整的报文，是，从packge中取出一段完整的报文
        {
            if (!part_packge.empty())
            {
                std::string resp_str;
                // 1.反序列化
                request req;
                req.Deserialize(part_packge);
                std::cout << "#############" << std::endl;
                req.Print();
                std::cout << "#############" << std::endl;
                // 2. 业务处理

                response resp = _cal(req); // 线程池？？


                // 3. 序列化
                resp.Serialize(resp_str);
                // 4. 添加长度说明 -- 协议
                Encode(resp_str);
                // 5. 添加所有的应答
                result_str += resp_str;
            }
        }
        LOG(LogLevel::DEBUG)<<"result_str: "<<result_str;
        return result_str;
    }
    ~Parse()
    {
    }

private:
    Cal_t _cal;
};